//
//  ViewController.swift
//  SwiftDeveloper
//
//  Created by 李爽 on 15/11/13.
//  Copyright (c) 2015年 Shawn Li. All rights reserved.
//

import UIKit

/********************************
使用默认构造函数
********************************/
class Student{
    //类属性
    var name:String = ""
    var number:Int = 0
}

/********************************
自定义构造函数
********************************/
class Person{
    //类属性
    var name:String
    var age:Int
    
    //类构造函数
    //init()：类的初始化方法（构造方法）
    init(newName:String, newAge:Int){
        self.name = newName
        self.age = newAge
    }
    
    //类方法
    func say() -> String{
        return "我叫\(name)"
    }
}
//deinit()：类反初始化方法（析构方法）,设置nil后即可执行deinit()方法,/可以做一些清理工作

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //stringTest()
        //var s = random();
        //areaOprator();
        //arrayTest()
        //dictionaryTest()
        switchTest()
        var age = 22
        TestFunction().add(age);
        println("age add is \(age)")
        TestFunction().add1(&age);
        println("age add1 is \(age)")
        TestFunction().printAdditiveResult(TestFunction().additive, a: 5 ,b: 7)
        //测试 返回函数类型
        let aFun = TestFunction().chooseFunction(3>2)
        println(aFun(3))  //2
        
        var student = Student()
        var p = Person(newName: "Ls",newAge: 32)
        println(p.say())
    }

    
    //MARK:字符串-String
    func stringTest() {
        let str = "CarryTeam.lofter.com";
        //判断字符串是否为空.isEmpty
        if str.isEmpty {
            println("空字符串");
        }
      
        //检查字符串是否有特定前缀/后缀：hasPrefix/hasSuffix
        if str.hasPrefix("carry") {
            println("有carry前缀")
        }
        
        if str.hasSuffix("com") {
            println("有后缀")
        }
        //通过字符串的uppercaseString、lowercaseString、capitalizedString属性来访问一个字符串的大写/小写/首字母大写
        var uppercase = str.uppercaseString
        println("大写 -- \(uppercase)")
        var lowercase = str.lowercaseString
        println("小写 -- \(lowercase)")
        var capitalized = str.capitalizedString
        println("首字母大写 -- \(capitalized)")
        
        println("-----  String-字符串  --------")
        
    }
    
    //MARK:随机数_验证码
    func random() -> String {
        var temp = Int(arc4random() % 100) + 1;//使用arc4random函数求一个1~100的随机数（包括1和100)
        var temp1:Int = Int(arc4random_uniform(100))+1;//使用arc4random_uniform函数求一个1~100的随机数（包括1和100）
        
        //生成4位数
        var number = arc4random() % 8999 + 1000;
        return "\(number)";
    }
    
    //MARK:区间运算符
    func areaOprator() {
       //闭区间运算符：a...b
        for iCount in 512...1024{
            //从512遍历到1024（包括1024）
        }
        
       //半闭区间运算符：a..<b
        var fruts = ["apple","orange","banana"]
        let iCount = fruts.count
        for i in 0..<iCount{
            println("第\(i+1)个水果是\(fruts[i])")
        }
        
        //字符串范围也可以使用区间运算符
        //字符串截取
        let words = "Hangge.com"
        
        //不使用区间运算符
        let rangeStr1 = words.substr(4, to: 2) //ge
        println(rangeStr1)
        
      //区间运算符除了返回一个Range外，还可以接受Comparable的输入，返回ClosedInterval或HalfOpenInterval
        //所以我们可以用这个特性检查字符串里的字符是不是都是合法字符（比如是不是都是小写）

        let interval = "a"..."z"
        for c in words {
            if !interval.contains(String(c)){
                println("\(c)不是小写字母")
            }
        }
        
        //H不是小写字母
        //.不是小写字母
    }
    
    //MARK:数组-Array
    func arrayTest() {
        var types = ["none","warning","error"]  //省略类型的数组声明
        
        var menbers = [String]() //声明一个空数组
        
        menbers.append("six")  //添加元素
        menbers += ["seven"] //添加元素
        menbers.insert("one", atIndex:0)  //指定位置添加元素
        
        menbers[0] = "message"  //通过下标修改数组中的数据
        menbers[0...2] = ["message","hangge","com"]  //通过小标区间替换数据（前3个数据）
        
        menbers.count  //获取数组元素个数
        menbers.isEmpty  //判断数组是否为空
        
        menbers.removeAtIndex(2)  //删除下标为2的数组
        menbers.removeLast()  //删除最后一个元素
       // menbers.removeAll(keepCapacity:true)  //删除数组中所有元素
        
        let addStringArr = types + menbers //数组组合
        
        //使用for in 实现数组遍历
        for value in menbers{
            println("\(value)");
        }
        
        //通过全局函数enumerate函数同时遍历数组的所有索引与数据
        for (index,value) in enumerate(menbers){
            println("索引：\(index) 数据：\(value)");
        }
        println("-----  数组-Array  --------")
    }
    
    //MARK:字典-Dictionary
    func dictionaryTest() {
        var empty = [String: Int]()  //建立个空字典
        
        var myDic = ["name":"hangge",
        "url":"hangge.com"]  //声明一个字典
        
        myDic["address"] = "china" //添加或修改key值
        myDic.removeValueForKey("name")  //删除"name"这个key值
        myDic["name"] = nil  //同样可以删除"name"这个key值
        myDic.keys  //访问字典的key集合
        myDic.values //访问字典的values集合
        
        //遍历字典
        for (key,value) in myDic {
            println("\(key):\(value)");
        }
        
        //只遍历字典的键（key）
        for key in myDic.keys {
            println("\(key)");
        }
        
        //只遍历字典的值（value）
        for value in myDic.values {
            println("\(value)");
        }
        println("-----  字典-Dictionary  --------")
    }
    
    //MARK:结构体 - struct
    //创建一个结构体
    struct BookInfo{
        var ID:Int = 0
        var Name:String = "Defaut"
        var Author:String = "Defaut"
    }
    
    func structSetup() {
        var book1:BookInfo //默认构造器创建结构体实例
        var book2 = BookInfo(ID:0021,Name:"航歌",Author:"hangge")  //调用逐一构造器创建实例
        book2.ID = 1234  //修改内部值
        println("\(book2)")
        println("-----  结构体-struct  --------")
    }
    
    //MARK:枚举-enmu
    enum CompassPoint {
        case North
        case South
        case East
        case West
    }
    
    enum Planet: Int {
        case Mercury = 1
        case Venus = 2
        case Earth = 3
    }
    
    enum Direction {
        case Up
        case Down
        
        func description() -> String{
            switch(self){
            case .Up:
                return "向上"
            case .Down:
                return "向下"
            }
        }
    }
    
    func enumSetup() {
        var directionToHead = CompassPoint.West
        
        let earthsOrder = Planet.Earth.rawValue //rawValue来获取他的原始值:3
        let possiblePlanet = Planet(rawValue: 2)  //通过原始值来寻找所对应的枚举成员:Venus
        print(Direction.Up.description())
        
        println("-----  枚举-enmu  --------")

    }
    
    //MARK:switch语句用法
    func switchTest() {
        //1.Swift中不需要在case块中显示地使用break跳出switch。如果想要实现C风格的落入特性，可以给需要的case分支插入fallthrough语句
        let fruit = "apple"
        switch fruit{
        case "apple":
            println("good")
            fallthrough
        case "banana","orange":
            println("great")
        default:
            println("bad")
        }
        
        //2.case分支还可以进行区间匹配
        let age = 5
        switch age {
        case 0...11:
            println("正太")
        case 12...30:
            println("少年")
        default:
            println("大叔")
        }
        
        //3.使用元组匹配（判断属于哪个象限）
        let point = (2,2)
        switch point {
        case (0,0):
            println("坐标在原点")
        case (_,0):
            println("坐标在x轴上")
        case (0,_):
            println("坐标在y轴上")
        case (-3...3, -3...3):
            println("坐标在长宽为6的正方形内")
        default:
            println("在什么地方")
        }
        //4.case中还可以使用where关键字来做额外的判断条件
        var height = 1.72
        switch height{
        case 1...3 where height == 1.72:
            println("case 1")
        case 1...3 where height == 2:
            println("case 2")
        default:
            println("default")
        }
        println("-----  switch语句  --------")
    }
    
    //MARK:FOR、WHILE-循环语句
    func loopTest() {
        for var i=1; i<100; i++ {
            println("\(i)")
        }
        
        for i in 1..<100{
            println("\(i)")
        }
        
        //遍历数组元素
        let numbers = [1,2,4,7]
        for num in numbers{
            println("\(num)")
        }
        
        //遍历字典
        let nameOfAge = ["lily":18, "Candy":24]
        for (aName, iAge) in nameOfAge{
            println("\(aName) is \(iAge)")
        }
        
        //遍历字符串的字符
        for chare in "shuangge" {
            println(chare)
        }
        
        //while循环语句
        var x = 0
        while x < 100 {
            x++
        }
        
        do{
            x++
        } while x < 100
    }

    

}

